[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scala 3から不可能となった、抽象型を使用した型射影について解説します。
抽象型の型射影が禁止された
これまでScalaでは、Tを任意の型とし、AをTの型のメンバとしたときの、一般型射影T#Aを許可していました。
Dottyでは、Tが抽象型の場合には禁止されるようになりました。
ただし、Tがクラスや型エイリアスである場合には問題ありません。
抽象型の型射影を使ったコードを書き換えるには、経路依存型や暗黙のパラメータの使用を検討してください。
変更の理由と影響
この変更は、型射影を無制限とすると、コンパイルは通るにもかかわらず実行時エラーjava.lang.ClassCastExceptionを投げる例が生じてしまうことから行われました。
詳しくはこちらのIssueをご覧ください。
この制限により、SKIコンビナート演算の型レベルのエンコーディングができなくなります。
SKIコンビネータ演算、あるいはその型レベルのエンコーディングについては以下のリンクで詳しく解説されています。
外部リンク:SKIコンビネータ計算 - Wikipedia
移行はScala 3.0にアップデートしてからがおすすめ
型射影はScala 3.0でも使用することができます。
3.0において型射影を書くと、場合によってはコンパイルエラーになります。
しかし移行オプション3.0-migrationを設定すると、以前と同様に使用することができます。
移行オプションについてはこちらの記事をご覧ください。
移行コストが高いと予想されるので、3.0へのアップデート後、パワーアップしたScalaの機能をフル活用して書き換えるのが得策です。
サイト内検索
カテゴリ「Scala 3で廃止予定の機能」の記事
            
              
                弱適合:Scala 3で廃止予定の機能(13)
              
                DelayedInitの解説:Scala 3で廃止予定の機能(1)
              
                [this]修飾子:Scala 3で廃止予定の機能(12)
              
                Scala 3で変更・廃止予定の機能と移行作業についてのまとめ
              
                シンボルリテラルの解説:Scala 3で廃止予定の機能(3)
              
                自動適用:Scala 3で廃止予定の機能(14)
              
                forSomeによる存在型:Scala 3で廃止予定の機能(6)
              
                型射影:Scala 3で廃止予定の機能(7)
              
                手続き型構文:Scala 3で廃止予定の機能(8)
              
                先行初期化:Scala 3で廃止予定の機能(9)
              
                do-while文の解説:Scala 3で廃止予定の機能(4)
              
                Scala 2のマクロ:Scala 3で廃止予定の機能(5)
              
                クラスシャドウイング:Scala 3で廃止予定の機能(10)
              
                XMLリテラルの解説:Scala 3で廃止予定の機能(2)
              
                大域脱出:Scala 3で廃止予定の機能(11)
              
            
          
        カテゴリ「Scala 3で廃止予定の機能」の記事
            
              
                弱適合:Scala 3で廃止予定の機能(13)
              
                DelayedInitの解説:Scala 3で廃止予定の機能(1)
              
                [this]修飾子:Scala 3で廃止予定の機能(12)
              
                Scala 3で変更・廃止予定の機能と移行作業についてのまとめ
              
                シンボルリテラルの解説:Scala 3で廃止予定の機能(3)
              
                自動適用:Scala 3で廃止予定の機能(14)
              
                forSomeによる存在型:Scala 3で廃止予定の機能(6)
              
                型射影:Scala 3で廃止予定の機能(7)
              
                手続き型構文:Scala 3で廃止予定の機能(8)
              
                先行初期化:Scala 3で廃止予定の機能(9)
              
                do-while文の解説:Scala 3で廃止予定の機能(4)
              
                Scala 2のマクロ:Scala 3で廃止予定の機能(5)
              
                クラスシャドウイング:Scala 3で廃止予定の機能(10)
              
                XMLリテラルの解説:Scala 3で廃止予定の機能(2)
              
                大域脱出:Scala 3で廃止予定の機能(11)